#ifndef COREPLUGIN_H
#define COREPLUGIN_H

/***************************************************************
	Класс для управления плагинами
	Авторы: ...
	Дата: 05.03.2010г
***************************************************************/

#include <QtCore/qglobal.h>
#include <QObject>
#include <QLibrary>
#include <QStringList>

#include <map>

using std::map;

class Q_DECL_EXPORT CorePlugin : public QObject {
	Q_OBJECT

public:
	/**
		Конструктор класса
		@param parent - родитель
		@param name - имя объекта
	*/
	CorePlugin(QObject* parent = 0, QString name = "");
    /**
    	Деструктор класса
    */
	~CorePlugin();

private:
	//данные библиотеки
	struct LIBDATA {
		QString info;		//описание библиотеки
		QLibrary* library;	//библиотека
	};

	//тип - массив библиотек - <наименование, данные библиотеки>
	typedef map<QString, LIBDATA> LIBS;

	//массив библиотек
	LIBS libs;

public slots:
	/**
		Загрузка плагина
		 name (входной параметр) - имя плагина
		 res (выходной параметр) - результат загрузки плагина
	*/
	void LoadPlugin(const QString& name, int& res);
	void LoadPlugin(const QString& name, bool& res);
	void LoadPlugin(const QString& name);

	/**
		Выгрузка плагина
		 name (входной параметр) - имя плагина
		 res (выходной параметр) - результат выгрузки плагина
	*/
	void UnloadPlugin(const QString& name, int& res);
	void UnloadPlugin(const QString& name, bool& res);
	void UnloadPlugin(const QString& name);

	/**
		Выгрузка всех плагинов
		 res (выходной параметр) - результат выгрузки плагинов
	*/
	void UnloadAllPlugins(int& res);
	void UnloadAllPlugins(bool& res);
	void UnloadAllPlugins();

	/**
		Запрос списка загруженых плагинов
		 list(выходной параметр) - список загруженных плагинов
	*/
	void PluginList(QStringList& list);

	/**
		Запрос информации о плагине
		 name (входной параметр) - имя плагина
		 info (выходной параметр) - информация о плагине
		 res (выходной параметр) - результат запроса информации о плагине
	*/
	void PluginInfo(const QString& name, QString& info, int& res);
	void PluginInfo(const QString& name, QString& info, bool& res);
	void PluginInfo(const QString& name, QString& info);

	/**
		Добавление плагина в список автозагрузки
		 name (входной параметр) - имя плагина
		 res (выходной параметр) - результат добавления плагина
	*/
	void AddPlugin(const QString& name, int& res);
	void AddPlugin(const QString& name, bool& res);
	void AddPlugin(const QString& name);

	/**
		Удаление плагина из списка автозагрузки
		 name (входной параметр) - имя плагина
		 res (выходной параметр) - результат удаления плагина
	*/
	void DelPlugin(const QString& name, int& res);
	void DelPlugin(const QString& name, bool& res);
	void DelPlugin(const QString& name);

	/**
		Запрос списка загруженых плагинов
		 list(выходной параметр) - список плагинов в автозагрузке
	*/
	void AutoList(QStringList& list);

private slots:
	//загрузка данных
	void LoadData();

signals:
	//cигнал установки ошибки
	void SetCurrentError(const int& num, const QString& source, const QStringList& params);

	//сигнал запроса списка параметров ini файла
	void GetParamList(const QString& file, const QString& sec, QStringList& parlist);
	//сигнал запроса значения параметра ini файла
	void GetValue(const QString& file, const QString& sec, const QString& par, QString& val);
	//сигнал установки параметра ini файла
	void SetValue(const QString& file, const QString& sec, const QString& par, const QString& val, int& res);
	//сигнал удаления параметра ini файла
	void DelParam(const QString& file, const QString& sec, const QString& par, bool& res);
	//сигнал удаления секции
	void DelSection(const QString& file, const QString& sec);

	//сигнал загрузки плагина
	void PluginLoaded(const QString& name);
	//сигнал выгрузки плагина
	void PluginUnloaded(const QString& name);
	//сигнал загрузки всех плагинов
	void AllPluginsLoaded();
	//сигнал выгрузки всех плагинов
	void AllPluginsUnloaded();

};

#endif // COREPLUGIN_H
